import xlwings as xw


# 读取excel文件中的数据
def getExcelData(path, boundary, boundary_end=0):
    """
        :param path:         excel的路径
        :param boundary:     选取的excel数据范围，为开始点（左上角）到右侧（选取数据中的最后一列的列名）
        :param boundary_end: 选取的excel数据范围，设定了选取数据的最后一行
        :return: 指定范围的数据，存放于数组中
     """
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(path)  # 打开Excel文件
    sheet = wb.sheets[0]  # 选择第0个表单，一般都是第0个
    all_drug_date_length = str(sheet.used_range.last_cell.row)  # 获取数据的条数
    # 用户未指定数据的最后一行，则默认是所有数据中的条数
    end = str(boundary_end) if boundary_end else all_drug_date_length
    data = sheet.range(boundary + end).value  # 获取指定范围的数据
    wb.close()  # 关闭数据流
    return data   # 返回数据


def addColor(path, data, col, col_start, makeColor=(255, 0, 0)):
    """
        :param path: excel的路径
        :param data: 需要查找的数据
        :param col:  定义在哪一列中查找
        :param col_start: 定义在哪一行中开始查找
        :param makeColor: 定义标记后的背景颜色，RGB格式，默认为红色
    """
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(path)  # 打开Excel文件
    sheet = wb.sheets[0]  # 选择第0个表单，一般都是第0个
    all_drug_date_length = sheet.used_range.last_cell.row  # 获取数据的条数
    for i in range(col_start, all_drug_date_length + 1):
        # 每个需要遍历的单元格
        cell = col + str(i) + ":" + col + str(i)
        # 如果这个学号在data中存在，则进行标记
        if sheet.range(cell).value in data:
            # 将背景设置为makeColor对应的颜色
            sheet.range(cell).color = makeColor
    wb.save()  # 保存更改到excel中
    print('处理成功！')
    wb.close()


if __name__ == "__main__":
    # 读取三个excel中的数据
    # 最后面两个参数设定了数据范围，从A3到A4
    all_data = getExcelData('./excels/all_data.xlsx', "A3:A", 8)
    part1 = getExcelData('./excels/part1.xlsx', "A3:A", 4)
    part2 = getExcelData('./excels/part2.xlsx', "A3:A", 4)
    # 合并两个excel中的数据
    concatenate_data = part1 + part2
    # 存放缺少的学生的学号
    lacks = []
    for item in all_data:
        if item not in concatenate_data:
            lacks.append(item)
    # 最后面两个参数设定了遍历范围，从A3开始
    addColor("./excels/all_data.xlsx", lacks, "A", 3)
